package io.renren.modules.pms.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.renren.common.utils.Query;
import io.renren.modules.pms.entity.ProductCategoryAttributeRelationEntity;
import io.renren.modules.pms.entity.dto.PmsProductCategoryDTO;
import io.renren.modules.pms.entity.dto.ProductWithChildrenDTO;
import io.renren.modules.pms.service.ProductCategoryAttributeRelationService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.renren.common.utils.PageUtils;

import io.renren.modules.pms.dao.PmsProductCategoryDao;
import io.renren.modules.pms.entity.PmsProductCategoryEntity;
import io.renren.modules.pms.service.PmsProductCategoryService;

import javax.annotation.Resource;



@Service("pmsProductCategoryService")
public class PmsProductCategoryServiceImpl extends ServiceImpl<PmsProductCategoryDao, PmsProductCategoryEntity> implements PmsProductCategoryService {

    @Resource
    PmsProductCategoryDao pmsProductCategoryDao;

    @Autowired
    ProductCategoryAttributeRelationService productCategoryAttributeRelationService;

    /**
     * 获取商品分类列表
     */
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Long parentId = Long.parseLong((String) params.getOrDefault("parentId","0"));

        IPage<PmsProductCategoryEntity> page = this.page(
                new Query<PmsProductCategoryEntity>().getPage(params),
                new QueryWrapper<PmsProductCategoryEntity>()
                        .lambda().eq(PmsProductCategoryEntity::getParentId,parentId)
        );

        return new PageUtils(page);
    }

    /**
     * 修改导航栏状态
     */
    @Override
    public boolean updateNavStatusById(Long id, Integer navStatus) {
        UpdateWrapper<PmsProductCategoryEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.lambda()
                .set(PmsProductCategoryEntity::getNavStatus,navStatus)
                .eq(PmsProductCategoryEntity::getId,id);
        return this.update(updateWrapper);
    }

    /**
     * 修改显示状态
     */
    @Override
    public boolean updateShowStatusById(Long id, Integer showStatus) {
        UpdateWrapper<PmsProductCategoryEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.lambda()
                .set(PmsProductCategoryEntity::getShowStatus,showStatus)
                .eq(PmsProductCategoryEntity::getId,id);
        return this.update(updateWrapper);
    }

    /**
     * 添加商品分类
     */
    @Override
    public boolean create(PmsProductCategoryDTO pmsProductCategoryDTO) {

        //保存商品分类数据
        PmsProductCategoryEntity pmsProductCategoryEntity = new PmsProductCategoryEntity();
        BeanUtils.copyProperties(pmsProductCategoryDTO,pmsProductCategoryEntity);
        if(pmsProductCategoryDTO.getParentId() == 0){
            pmsProductCategoryDTO.setLevel(0);
        }else {
            pmsProductCategoryDTO.setLevel(1);
        }
        this.save(pmsProductCategoryEntity);

        //保存商品分类_筛选属性
        saveAttrRelation(pmsProductCategoryDTO, pmsProductCategoryEntity);
        return true;
    }

    @Override
    public boolean update(PmsProductCategoryDTO pmsProductCategoryDTO) {

        //保存商品分类数据
        PmsProductCategoryEntity pmsProductCategoryEntity = new PmsProductCategoryEntity();
        BeanUtils.copyProperties(pmsProductCategoryDTO,pmsProductCategoryEntity);
        if(pmsProductCategoryDTO.getParentId() == 0){
            pmsProductCategoryDTO.setLevel(0);
        }else {
            pmsProductCategoryDTO.setLevel(1);
        }
        this.updateById(pmsProductCategoryEntity);


        //删除已保存的筛选属性_根据商品分类id删除
        QueryWrapper<ProductCategoryAttributeRelationEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(ProductCategoryAttributeRelationEntity::getProductCategoryId,pmsProductCategoryEntity.getId());
        productCategoryAttributeRelationService.remove(queryWrapper);
        saveAttrRelation(pmsProductCategoryDTO, pmsProductCategoryEntity);
        return true ;
    }

    @Override
    public List<ProductWithChildrenDTO> getWithChildren() {
        return pmsProductCategoryDao.getWithChildren();
    }


    private boolean saveAttrRelation(PmsProductCategoryDTO pmsProductCategoryDTO, PmsProductCategoryEntity pmsProductCategoryEntity) {
        List<Long> productAttributeIdList = pmsProductCategoryDTO.getProductAttributeIdList();
        List<ProductCategoryAttributeRelationEntity> list = new ArrayList<>();
        for (int i = 0; i < productAttributeIdList.size(); i++) {
            ProductCategoryAttributeRelationEntity productCategoryAttributeRelationEntity = new ProductCategoryAttributeRelationEntity();
            productCategoryAttributeRelationEntity.setProductCategoryId(pmsProductCategoryEntity.getId());
            productCategoryAttributeRelationEntity.setProductAttributeId(productAttributeIdList.get(i));
            list.add(productCategoryAttributeRelationEntity);
        }
        return productCategoryAttributeRelationService.saveBatch(list);
    }
}
